home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / ohelp.bbq < prev    next >
Text File  |  2000-09-26  |  27KB  |  1,215 lines

  1. /* ******************************************************************* */
  2. /* **                                                               ** */
  3. /* **                     ATUtilities Online Help                   ** */
  4. /* **            Copright (C) 1992-1993 by Thomas Dreibholz         ** */
  5. /* **                      All rights reserved                      ** */
  6. /* **                                                               ** */
  7. /* ******************************************************************* */
  8.  
  9. #define PAGE_INDEX 1
  10. #define PAGE_TEXT  2
  11. #define ZEILEN     25
  12.  
  13. #include "ATUtilities.h"
  14. /*
  15. #define CreateBoolGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(0,win,x,y,w,h,text,id)
  16. #define CreateMinGadget(win,x,y,w,h,id) CreateBoolToggleGadget(4,win,x,y,w,h,0L,id)
  17. */
  18. extern struct Library *DiskfontBase;
  19.  
  20.  
  21. /* feste Strukturen */
  22. UWORD Strings=66;
  23. UBYTE *String[]=
  24. {
  25.  "",
  26.  "\x9b1;33;40mBedienung des Online-Hilfesystems\x9b0;33;40m",
  27.  "",
  28.  "",
  29.  "\x9b4;33;40mAuswahl von Seiten\x9b0;33;40m",
  30.  "",
  31.  "Beim Aufruf des Hilfesystems wird zuerst der Hauptindex geladen. Durch",
  32.  "Klicken auf die Gadgets im Index gelangt man zu den entsprechenden",
  33.  "Seiten.",
  34.  "",
  35.  "Am unteren Bildschirmrand befindet sich mindestens ein Gadget; maximal",
  36.  "jedoch vier. Mit ihnen kann zur nächsten bzw. vorhergehenden Seite ge-",
  37.  "wechselt werden.",
  38.  "",
  39.  "Gadget-Positionen und ihre Funktionen",
  40.  "",
  41.  "[Vorherg. Index]  [Vorherg. Texts.] [Nächste Texts.]  [Nächster Index]",
  42.  "",
  43.  "",
  44.  "\x9b4;33;40mSeitentypen\x9b0;33;40m",
  45.  "",
  46.  "",
  47.  "Indexseiten"
  48.  "",
  49.  "Auf Indexseiten befinden sich Gadgets, die zu den entsprechenden Text-",
  50.  "seiten führen.",
  51.  "",
  52.  "",
  53.  "Textseiten",
  54.  "",
  55.  "Auf diesen Seiten stehen die Hilfstexte. Ist der Text größer als der",
  56.  "im Textfenster zur Verfügung stehende Platz, so läßt sich der Text-",
  57.  "ausschnitt mit dem Proportional-Gadget am rechten Bildschirmrand ver-",
  58.  "schieben.",
  59.  "Besitzt die Seite Querverweise auf andere Seiten, so sind diese im",
  60.  "Menü \"Querverweise\" aufgelistet. Durch Anwahl des entsprechenden",
  61.  "Menüpunktes wird die Seite geladen.",
  62.  "Gleiches gilt für Bilder und Diagramme im Menü \"Bilder\".",
  63.  "",
  64.  "",
  65.  "\x9b4;33;40mDas Datei-Menü\x9b0;33;40m",
  66.  "",
  67.  "",
  68.  "Der Menüpunkt \"Einstellungen ändern\"",
  69.  "",
  70.  "Hier lassen sich die Grundeinstellungen des Hilfesystems ändern:",
  71.  "Cache-Modus: Die Hilfedatei wird beim Start komplett in den Haupt-",
  72.  "             speicher geladen. Bei Systemen mit wenig Speicher kann",
  73.  "             der Modus ausgeschaltet werden. Bei jeder neuen Seite",
  74.  "             wird dann vom Datenträger nachgeladen."
  75.  "",
  76.  "",
  77.  "Der Menüpunkt \"Bedienungshinweise\"",
  78.  "",
  79.  "Hiermit wird dieser Text angezeigt.",
  80.  "",
  81.  "",
  82.  "Der Menüpunkt \"Information\"",
  83.  "",
  84.  "Hiermit werden Informationen über das Hilfesystem, die Version und",
  85.  "den noch freien Speicher im Amiga und auf einer eventuell vorhan-",
  86.  "denen PC/AT-Brückenkarte angezeigt.",
  87.  "",
  88.  "",
  89.  "Der Menüpunkt \"Hilfe beenden\"",
  90.  "",
  91.  "Hiermit wird das Hilfesystem geschlossen und in das Anwendungs-",
  92.  "programm zurückgekehrt."
  93. };
  94.  
  95. struct TextAttr Opal=
  96. {
  97.  "opal.font",
  98.  9,
  99.  FS_NORMAL,
  100.  FPF_DISKFONT
  101. };
  102.  
  103. struct NewScreen HelpScreen=
  104. {
  105.  0,0,640,256,3,
  106.  0,1,
  107.  HIRES,
  108.  CUSTOMSCREEN,
  109.  NULL,
  110.  NULL,NULL,NULL
  111. };
  112.  
  113. struct Page
  114. {
  115.  UWORD Length;
  116.  UWORD Flags;
  117.  ULONG Offset;
  118.  ULONG TextOffset;
  119.  ULONG GadgetOffset;
  120. };
  121.  
  122. struct Pages
  123. {
  124.  struct Page Page[1000];
  125. };
  126.  
  127. #define GOFFSET(x) hd->Pages->Page[x].GadgetOffset
  128. #define TOFFSET(x) hd->Pages->Page[x].TextOffset
  129. #define OFFSET(x) hd->Pages->Page[x].Offset
  130. #define LENGTH(x) hd->Pages->Page[x].Length
  131. #define FLAGS(x) hd->Pages->Page[x].Flags
  132.  
  133. struct HelpData
  134. {
  135.  struct Screen     *Screen;
  136.  struct Window     *MainWindow;
  137.  struct Window     *IndexWindow;
  138.  struct Window     *TextWindow;
  139.  struct MenuStrip  *MenuStrip;
  140.  struct Menu       *DateiMenu;
  141.  struct Menu       *QVMenu;
  142.  struct Menu       *BilderMenu;
  143.  struct Window     *GadWindow;
  144.  struct Gadget     *PropGadget;
  145.  struct PropInfo   *PropInfo;
  146.  struct RastPort   *MainRastPort;
  147.  struct RastPort   *IndexRastPort;
  148.  struct MsgPort    *MainUserPort;
  149.  struct MsgPort    *IndexUserPort;
  150.  struct MsgPort    *TextUserPort;
  151.  struct MsgPort    *GadUserPort;
  152.  struct TextFont   *OpalFont;
  153.  struct ViewPort   *ViewPort;
  154.  struct MsgPort    *ConPort;
  155.  struct IOStdReq   *ConReq;
  156.  LONG               ConDev;
  157.  struct FileHandle *HelpFile;
  158.  UBYTE             *Memory;
  159.  struct Pages      *Pages;
  160.  UWORD              Page;
  161.  UWORD              Flags;
  162.  ULONG              MainWindowSM;
  163.  ULONG              IndexWindowSM;
  164.  ULONG              TextWindowSM;
  165.  ULONG              GadWindowSM;
  166.  ULONG              WaitSM;
  167.  UWORD              NextPage[4];
  168.  
  169.  UWORD              IGy;
  170.  UWORD              IGw;
  171.  UWORD              IGs;
  172.  UWORD              IGPCount;
  173.  struct Gadget     *IndexGadgets[64];
  174.  UWORD              IndexGadgetPages[64];
  175.  
  176.  UWORD              MenuPageCount;
  177.  UWORD              MenuNames[25][70];
  178.  UWORD              MenuPages[25];
  179.  
  180.  UWORD              PropBody;
  181.  UWORD              LineCount;
  182.  UWORD              CurrentLine;
  183.  UBYTE             *Lines[2000];
  184. }; 
  185.  
  186. UWORD Colors[]={0x97a,0x222,0xddd,0xff5,0xdd6,0xccc,0xfff,0x22f};
  187.  
  188. BOOL OpenHelp();
  189. VOID CloseHelp();
  190. VOID ConWrite();
  191. VOID RefreshGadWindow();
  192. VOID GetTitle();
  193. VOID LoadPage();
  194. VOID ShowIndexPage();
  195. VOID ShowTextPage();
  196. VOID RemIndexGadgets();
  197. VOID NewProp();
  198. VOID ShowPart();
  199. VOID MakeMenu();
  200. VOID Hinweise();
  201.  
  202. UBYTE *GetOpalLine();
  203. UBYTE *GetOpalLine450();
  204. VOID RemoveMenuStrip();
  205. VOID UseMenuStrip();
  206. struct MenuStrip *BuildMenuStrip();
  207. struct Menu      *AddMenu();
  208. struct Menu      *AddItem();
  209.  
  210.  
  211. /* Informationen anzeigen */
  212. VOID ShowInfo(win,scr)
  213.  struct Window *win;
  214.  struct Screen *scr;
  215. {
  216.  WBenchToFront();
  217.  InformationBox("ATUtilities Online Help - Information",
  218.                 "Online Help - Version 2.0",
  219.                 "Copyright (C) 1993 by",
  220.                 "Thomas Dreibholz",
  221.                 "All rights reserved.",
  222.                 "SYS:PC/ATUtilities/Icons/Help");
  223.  ScreenToFront(scr);
  224.  ActivateWindow(win);
  225. }
  226.  
  227.  
  228. /* Online-Hilfe-Funktion */
  229. VOID Help(name,seite)
  230.  UBYTE *name;
  231.  UWORD  seite;
  232. {
  233.  struct IntuiMessage *msg;
  234.  struct HelpData     *hd;
  235.  struct Gadget       *gad;
  236.  ULONG                Class;
  237.  BOOL                 ende,bool;
  238.  UWORD                i,j,Code;
  239.  UWORD                MenuNum,ItemNum;
  240.  ULONG                Signale;
  241.  
  242.  if(DiskfontBase==NULL)
  243.   {
  244.    InfoRequest("Keine Diskfont-Library!");
  245.    return;
  246.   }
  247.  
  248.  hd=AllocMem(sizeof(struct HelpData),MEMF_CLEAR|MEMF_PUBLIC);
  249.  if(hd==NULL)
  250.   {
  251.    ErrorRequest(ERROR_ALLOC);
  252.    return;
  253.   }
  254.  
  255.  bool=OpenHelp(hd,name);
  256.  if(bool==TRUE)
  257.   {
  258.    ende=FALSE;
  259.    while(ende==FALSE)
  260.     {
  261.      Signale=Wait(hd->WaitSM);
  262.      if((hd->GadUserPort!=NULL) && (Signale & hd->GadWindowSM))
  263.       {
  264.        msg=GetMsg(hd->GadUserPort);
  265.        if(msg!=NULL)
  266.         {
  267.          Class=msg->Class;
  268.          gad=msg->IAddress;
  269.          ReplyMsg(msg);
  270.          if(Class==GADGETUP)
  271.           {
  272.            j=gad->GadgetID;
  273.            LoadPage(hd,hd->NextPage[j]);
  274.           }
  275.          else if(Class==ACTIVEWINDOW)
  276.            ActivateWindow(hd->MainWindow);
  277.         }
  278.       }
  279.      if(Signale & hd->MainWindowSM)
  280.       {
  281.        msg=GetMsg(hd->MainUserPort);
  282.        if(msg!=NULL)
  283.         {
  284.          Class=msg->Class;
  285.          Code=msg->Code;
  286.          gad=msg->IAddress;
  287.          ReplyMsg(msg);
  288.          switch(Class)
  289.           {
  290.            case GADGETUP:
  291.             j=gad->GadgetID;
  292.             switch(j)
  293.              {
  294.               case 1:
  295.                 ende=TRUE;
  296.                break;
  297.               case 2:
  298.                 LoadPage(hd,0);
  299.                break;
  300.               case 3:
  301.                 if(hd->Flags==PAGE_TEXT)
  302.                  {
  303.                   j=hd->PropInfo->VertPot/(65535/hd->PropBody);
  304.                   ShowPart(hd,j);
  305.                  }
  306.                break;
  307.              }
  308.             break;
  309.            case MENUPICK:
  310.              MenuNum=MENUNUM(Code);
  311.              ItemNum=ITEMNUM(Code);
  312.              switch(MenuNum)
  313.               {
  314.                case 2:
  315.                  switch(ItemNum)
  316.                   {
  317.                    case 0:
  318.                      ende=TRUE;
  319.                     break;
  320.                    case 2:
  321.                      ShowInfo(hd->MainWindow,hd->Screen);
  322.                     break;
  323.                    case 3:
  324.                      Hinweise(hd);
  325.                     break;
  326.                   }
  327.                 break;
  328.                case 1:
  329.                  if((hd->MenuPageCount!=0)&&(ItemNum<=hd->MenuPageCount))
  330.                    LoadPage(hd,hd->MenuPages[hd->MenuPageCount-ItemNum-1]);
  331.                 break;
  332.               }
  333.             break;
  334.           }
  335.         }
  336.       }
  337.      if(Signale & hd->IndexWindowSM)
  338.       {
  339.        msg=GetMsg(hd->IndexUserPort);
  340.        if(msg!=NULL)
  341.         {
  342.          Class=msg->Class;
  343.          gad=msg->IAddress;
  344.          ReplyMsg(msg);
  345.          if(Class==GADGETUP)
  346.           {
  347.            j=gad->GadgetID;
  348.            LoadPage(hd,hd->IndexGadgetPages[j]);
  349.           }
  350.          else if(Class==ACTIVEWINDOW)
  351.            ActivateWindow(hd->MainWindow);
  352.         }
  353.       }
  354.      if(Signale & hd->TextWindowSM)
  355.       {
  356.        msg=GetMsg(hd->TextUserPort);
  357.        if(msg!=NULL)
  358.         {
  359.          Class=msg->Class;
  360.          ReplyMsg(msg);
  361.          if(Class==ACTIVEWINDOW)
  362.            ActivateWindow(hd->MainWindow);
  363.         }
  364.       }
  365.     }
  366.   }
  367.  CloseHelp(hd);
  368.  FreeMem(hd,sizeof(struct HelpData));
  369. }
  370.  
  371.  
  372. BOOL OpenHelp(hd,name)
  373.  struct HelpData *hd;
  374.  UBYTE           *name;
  375. {
  376.  UBYTE c;
  377.  WORD  a,i;
  378.  LONG  b;
  379.  static struct NewWindow MainWindowDef=
  380.   {
  381.    0,0,640,256,
  382.    0,2,
  383.    GADGETUP|MENUPICK,
  384.    NOCAREREFRESH|ACTIVATE|BORDERLESS,
  385.    NULL,NULL,NULL,NULL,NULL,
  386.    10,16,640,256,
  387.    CUSTOMSCREEN
  388.   };
  389.  static struct NewWindow IndexWindowDef=
  390.   {
  391.    11,26,582,210,
  392.    0,1,
  393.    GADGETUP|ACTIVEWINDOW,
  394.    BORDERLESS,
  395.    NULL,NULL,NULL,NULL,NULL,
  396.    10,16,640,256,
  397.    CUSTOMSCREEN
  398.   };
  399.  static struct NewWindow TextWindowDef=
  400.   {
  401.    12,27,580,208,
  402.    0,1,
  403.    ACTIVEWINDOW,
  404.    BORDERLESS,
  405.    NULL,NULL,NULL,NULL,NULL,
  406.    10,16,640,256,
  407.    CUSTOMSCREEN
  408.   };
  409.  
  410.  hd->ConDev=-1L;
  411.  
  412.  hd->OpalFont=GetOpalFont();
  413.  if(hd->OpalFont==NULL)
  414.   {
  415.    InfoRequest("Opal-Font fehlt!");
  416.    return(FALSE);
  417.   }
  418.  
  419.  hd->Screen=OpenScreen(&HelpScreen);
  420.  if(hd->Screen==NULL)
  421.   {
  422.    InfoRequest("Kann Screen nicht öffnen!");
  423.    return(FALSE);
  424.   }
  425.  
  426.  hd->ViewPort=&hd->Screen->ViewPort;
  427.  LoadRGB4(hd->ViewPort,&Colors,8);
  428.  
  429.  MainWindowDef.Screen=hd->Screen;
  430.  IndexWindowDef.Screen=hd->Screen;
  431.  TextWindowDef.Screen=hd->Screen;
  432.  
  433.  hd->IndexWindow=OpenWindow(&IndexWindowDef);
  434.  if(hd->IndexWindow==NULL)
  435.   {
  436.    InfoRequest("Kann Fenster nicht öffnen!");
  437.    return(FALSE);
  438.   }
  439.  
  440.  hd->TextWindow=OpenWindow(&TextWindowDef);
  441.  if(hd->TextWindow==NULL)
  442.   {
  443.    InfoRequest("Kann Fenster nicht öffnen!");
  444.    return(FALSE);
  445.   }
  446.  
  447.  hd->MainWindow=OpenWindow(&MainWindowDef);
  448.  if(hd->MainWindow==NULL)
  449.   {
  450.    InfoRequest("Kann Fenster nicht öffnen!");
  451.    return(FALSE);
  452.   }
  453.  
  454.  hd->MainRastPort=hd->MainWindow->RPort;
  455.  hd->IndexRastPort=hd->IndexWindow->RPort;
  456.  hd->MainUserPort=hd->MainWindow->UserPort;
  457.  hd->IndexUserPort=hd->IndexWindow->UserPort;
  458.  hd->TextUserPort=hd->TextWindow->UserPort;
  459.  hd->MainWindowSM=(1L<<hd->MainUserPort->mp_SigBit);
  460.  hd->IndexWindowSM=(1L<<hd->IndexUserPort->mp_SigBit);
  461.  hd->TextWindowSM=(1L<<hd->TextUserPort->mp_SigBit);
  462.  hd->MainWindow->UserData=NULL;
  463.  hd->IndexWindow->UserData=NULL;
  464.  hd->TextWindow->UserData=NULL;
  465.  
  466.  SetFont(hd->MainRastPort,hd->OpalFont);
  467.  SetFont(hd->IndexRastPort,hd->OpalFont);
  468.  
  469.  CreateBoolGadget(hd->MainWindow,10,10,150,12,"Ende",1);
  470.  CreateBoolGadget(hd->MainWindow,165,10,150,12,"Index",2);
  471.  hd->PropGadget=CreatePropGadget(hd->MainWindow,600,25,30,211,0,0,0,(65535/10),3);
  472.  hd->PropInfo=hd->PropGadget->SpecialInfo;
  473.  DrawNBorder(hd->MainWindow,10,25,584,211);
  474.  
  475.  SetAPen(hd->MainRastPort,3);
  476.  WriteText(hd->MainRastPort,40,40,"ATUtilities Online-Hilfe - Version 2.0");
  477.  WriteText(hd->MainRastPort,40,60,"Hilfedatei wird bearbeitet.");
  478.  WriteText(hd->MainRastPort,40,80,"Bitte warten...");
  479.  
  480.  hd->ConPort=CreatePort("onlinehelp-console.port",0L);
  481.  if(hd->ConPort==NULL)
  482.   {
  483.    InfoRequest("Kann MsgPort nicht erstellen!");
  484.    return(FALSE);
  485.   }
  486.  
  487.  hd->ConReq=CreateExtIO(hd->ConPort,sizeof(struct IOStdReq));
  488.  if(hd->ConReq==NULL)
  489.   {
  490.    InfoRequest("Kann IOStdReq nicht erstellen!");
  491.    return(FALSE);
  492.   }
  493.  
  494.  hd->ConReq->io_Data=hd->TextWindow;
  495.  hd->ConReq->io_Length=sizeof(struct Window);
  496.  
  497.  hd->ConDev=OpenDevice("console.device",0L,hd->ConReq,0L);
  498.  if(hd->ConDev!=0)
  499.   {
  500.    InfoRequest("Kann Console-Device nicht öffnen!");
  501.    return(FALSE);
  502.   }
  503.  
  504.  ConWrite(hd,"\x9b");
  505.  ConWrite(hd,"0;33;40m");
  506.  
  507.  hd->HelpFile=Open(name,MODE_OLDFILE);
  508.  if(hd->HelpFile==NULL)
  509.   {
  510.    MultiRequest("Kann Hilfedatei nicht öffnen:",name,"Okay",NULL);
  511.    return(FALSE);
  512.   }
  513.  
  514.  hd->Pages=AllocMem(sizeof(struct Pages),MEMF_CLEAR|MEMF_PUBLIC);
  515.  if(hd->Pages==NULL)
  516.   {
  517.    ErrorRequest(ERROR_ALLOC);
  518.    return(FALSE);
  519.   }
  520.  
  521.  hd->Memory=AllocMem(50000,MEMF_CLEAR|MEMF_PUBLIC);
  522.  if(hd->Memory==NULL)
  523.   {
  524.    ErrorRequest(ERROR_ALLOC);
  525.    return(FALSE);
  526.   }
  527.  
  528.  Seek(hd->HelpFile,-4,OFFSET_END);
  529.  Read(hd->HelpFile,&b,4L);
  530.  Seek(hd->HelpFile,b,OFFSET_BEGINNING);
  531.  for(i=0;i<1000;i++)
  532.   {
  533.    Read(hd->HelpFile,&c,1L);
  534.    if(c!=0)
  535.     {
  536.      Read(hd->HelpFile,&a,2L);
  537.      Read(hd->HelpFile,&b,4L);
  538.      LENGTH(i)=a;
  539.      OFFSET(i)=b;
  540.      FLAGS(i)=c;
  541.      Read(hd->HelpFile,&b,4L);
  542.      TOFFSET(i)=b;
  543.      Read(hd->HelpFile,&b,4L);
  544.      GOFFSET(i)=b;
  545.     }
  546.   }
  547.  
  548.  hd->MenuStrip=BuildMenuStrip(hd->MainWindow,7,AUTOBACKPEN);
  549.  if(hd->MenuStrip==NULL)
  550.   {
  551.    InfoRequest("Kein Speicher für Menu!");
  552.    return(FALSE);
  553.   }
  554.  
  555.  hd->Page=12345;
  556.  LoadPage(hd,0);
  557.  return(TRUE);
  558. }
  559.  
  560.  
  561. VOID CloseHelp(hd)
  562.  struct HelpData *hd;
  563. {
  564.  
  565.  RemIndexGadgets(hd);
  566.  if(hd->MenuStrip) RemoveMenuStrip(hd->MenuStrip,TRUE);
  567.  if(hd->ConDev==0) CloseDevice(hd->ConReq);
  568.  if(hd->GadWindow) DeleteStdWindow(hd->GadWindow);
  569.  if(hd->TextWindow) DeleteStdWindow(hd->TextWindow);
  570.  if(hd->IndexWindow) DeleteStdWindow(hd->IndexWindow);
  571.  if(hd->MainWindow) DeleteStdWindow(hd->MainWindow);
  572.  if(hd->Screen) CloseScreen(hd->Screen);
  573.  if(hd->ConReq) DeleteExtIO(hd->ConReq);
  574.  if(hd->ConPort) DeletePort(hd->ConPort);
  575.  if(hd->Pages) FreeMem(hd->Pages,sizeof(struct Pages));
  576.  if(hd->Memory) FreeMem(hd->Memory,50000);
  577.  if(hd->OpalFont) CloseFont(hd->OpalFont);
  578.  if(hd->HelpFile) Close(hd->HelpFile);
  579. }
  580.  
  581.  
  582. VOID ConWrite(hd,text)
  583.  struct HelpData *hd;
  584.  UBYTE           *text;
  585. {
  586.  hd->ConReq->io_Data=text;
  587.  hd->ConReq->io_Length=strlen(text);
  588.  hd->ConReq->io_Command=CMD_WRITE;
  589.  SendIO(hd->ConReq);
  590. }
  591.  
  592.  
  593. VOID RefreshGadWindow(hd)
  594.  struct HelpData *hd;
  595. {
  596.  WORD i;
  597.  static struct NewWindow GadWindowDef=
  598.   {
  599.    0,238,640,15,
  600.    0,1,
  601.    GADGETUP|ACTIVEWINDOW,
  602.    NOCAREREFRESH|BORDERLESS,
  603.    NULL,NULL,NULL,NULL,NULL,
  604.    10,10,640,256,
  605.    CUSTOMSCREEN
  606.   };
  607.  
  608.  if(hd->GadWindow!=NULL)
  609.    DeleteStdWindow(hd->GadWindow);
  610.  GetTitle(hd,hd->Page);
  611.  DrawMNTextBorder(hd->MainWindow,320,10,310,12,hd->Memory);
  612.  
  613.  GadWindowDef.Screen=hd->Screen;
  614.  hd->GadWindow=OpenWindow(&GadWindowDef);
  615.  if(hd->GadWindow!=NULL)
  616.   {
  617.    SetFont(hd->GadWindow->RPort,hd->OpalFont);
  618.    hd->GadUserPort=hd->GadWindow->UserPort;
  619.    hd->GadWindowSM=(1L<<hd->GadUserPort->mp_SigBit);
  620.    for(i=0;i<=3;i++) hd->NextPage[i]=0xFFFF;
  621.  
  622.    if(hd->Page>0)
  623.     {
  624.      for(i=(hd->Page-1);i>=0;i--)
  625.        if(FLAGS(i)==PAGE_INDEX)
  626.         { hd->NextPage[0]=i; break; }
  627.     }
  628.  
  629.    if(hd->Page!=0) hd->NextPage[3]=0;
  630.    if(hd->Page<999)
  631.     {
  632.      for(i=(hd->Page+1);i<=999;i++)
  633.        if(FLAGS(i)==PAGE_INDEX)
  634.         { hd->NextPage[3]=i; break; }
  635.     }
  636.  
  637.    if(hd->Page>0)
  638.     {
  639.      for(i=(hd->Page-1);i>=0;i--)
  640.       {
  641.        if(FLAGS(i)!=0)
  642.         {
  643.          if(FLAGS(i)==PAGE_TEXT)
  644.            hd->NextPage[1]=i;
  645.          break;
  646.         }
  647.       }
  648.     }
  649.  
  650.    if(hd->Page<999)
  651.     {
  652.      for(i=(hd->Page+1);i<=999;i++)
  653.       {
  654.        if(FLAGS(i)!=0)
  655.         {
  656.          if(FLAGS(i)==PAGE_TEXT)
  657.            hd->NextPage[2]=i;
  658.          break;
  659.         }
  660.       }
  661.     }
  662.  
  663.    for(i=0;i<=3;i++)
  664.     {
  665.      if(hd->NextPage[i]!=0xFFFF)
  666.       {
  667.        GetTitle(hd,hd->NextPage[i]);
  668.        CreateMBoolGadget(hd->GadWindow,10+(i*155),1,150,12,hd->Memory,i);
  669.       }
  670.     }
  671.   }
  672.  else
  673.   {
  674.    hd->GadWindowSM=0;
  675.    hd->GadUserPort=NULL;
  676.   }
  677.  hd->WaitSM=hd->GadWindowSM+hd->MainWindowSM+hd->IndexWindowSM+hd->TextWindowSM;
  678. }
  679.  
  680.  
  681. VOID GetTitle(hd,p)
  682.  struct HelpData *hd;
  683.  LONG             p;
  684.  LONG i,o;
  685.  
  686.  i=OFFSET(p);
  687.  if(i!=0)
  688.   {
  689.    o=Seek(hd->HelpFile,i,OFFSET_BEGINNING);
  690.    Read(hd->HelpFile,hd->Memory,1024L);
  691.    Seek(hd->HelpFile,o,OFFSET_BEGINNING);
  692.   }
  693.  else hd->Memory[0]=0x00;
  694. }
  695.  
  696.  
  697. VOID LoadPage(hd,num)
  698.  struct HelpData *hd;
  699.  UWORD            num;
  700. {
  701.  
  702.  if(num==hd->Page) return;
  703.  if(OFFSET(num)!=0)
  704.   {
  705.    RemIndexGadgets(hd);
  706.    hd->Page=num;
  707.    hd->Flags=FLAGS(num);
  708.    switch(hd->Flags)
  709.     {
  710.      case PAGE_INDEX:
  711.        NewProp(hd,1);
  712.        ShowIndexPage(hd,num);
  713.       break;
  714.      case PAGE_TEXT:
  715.        ShowTextPage(hd,num);
  716.       break;
  717.     }
  718.   }
  719.  else
  720.   {
  721.    DisplayBeep(hd->Screen);
  722.    DisplayBeep(hd->Screen);
  723.   }
  724. }
  725.  
  726.  
  727. VOID ShowIndexPage(hd,num)
  728.  struct HelpData *hd;
  729.  UWORD            num;
  730. {
  731.  UBYTE *m;
  732.  LONG   i,j;
  733.  UWORD  x,y,w;
  734.  UWORD  wort;
  735.  UBYTE  c;
  736.  
  737.  x=15; y=11;
  738.  j=TOFFSET(num);
  739.  if(j!=0)
  740.   {
  741.    i=LENGTH(num);
  742.    Seek(hd->HelpFile,j,OFFSET_BEGINNING);
  743.    Read(hd->HelpFile,hd->Memory,i);
  744.  
  745.  /* ----- Testausgabe -------------------------------------------------- */
  746.    SetAPen(hd->IndexRastPort,3);
  747.    m=hd->Memory;
  748.    for(j=0;j<i;j++)
  749.     {
  750.      c=m[j];
  751.      if(c==0x00)
  752.       {
  753.        x=15;
  754.        y+=10;
  755.       }
  756.      else
  757.       {
  758.        Move(hd->IndexRastPort,x,y);
  759.        Text(hd->IndexRastPort,&c,1L);
  760.        x=x+TextLength(hd->IndexRastPort,&c,1L);
  761.       }
  762.     }
  763.   }
  764.  
  765.  /* ----- Gadgets ------------------------------------------------------ */
  766.  j=GOFFSET(num);
  767.  if(j!=0)
  768.   {
  769.    Seek(hd->HelpFile,j,OFFSET_BEGINNING);
  770.    j=0;
  771.    Read(hd->HelpFile,&wort,2L);
  772.    while((wort!=0xFFFF)&&(j<=63))
  773.     {
  774.      hd->IndexGadgetPages[j]=wort;
  775.      j++;
  776.      Read(hd->HelpFile,&wort,2L);
  777.     }
  778.    hd->IGPCount=j;
  779.  
  780.  
  781.   printf("Y: %ld\n",y);
  782.   hd->IGy=(195-y)/27;
  783.   hd->IGs=hd->IGPCount/hd->IGy;
  784.  
  785.   hd->IGw=((552-((hd->IGs-1)*5))/hd->IGs);
  786.  
  787.   printf("Gad/Spalte %ld\n",hd->IGy);
  788.   printf("Spalten    %ld\n",hd->IGs);
  789.   printf("Width      %ld\n",hd->IGw);
  790.  
  791.   x=15;
  792.   for(i=0;i<hd->IGPCount;i++)
  793.     {
  794.      if(hd->IndexGadgetPages[i]!=2000)
  795.       {
  796.        GetTitle(hd,hd->IndexGadgetPages[i]);
  797.        hd->IndexGadgets[i]=CreateMBoolGadget(hd->IndexWindow,x,y,hd->IGw,12,hd->Memory,i);
  798.        x+=hd->IGw+5;
  799.        if(x>550) { x=15; y+=15; }
  800.       }
  801.      else
  802.       {
  803.        if(x>15)
  804.         {
  805.          x=15; y+=15;
  806.         }
  807.        y+=10;
  808.       }
  809.     }
  810.   }
  811.  
  812.  /* ----- GadWindow öffnen --------------------------------------------- */
  813.  
  814.  WindowToFront(hd->IndexWindow);
  815.  RefreshGadWindow(hd);
  816.  MakeMenu(hd);
  817. }
  818.  
  819.  
  820. VOID ShowTextPage(hd,num)
  821.  struct HelpData *hd;
  822.  UWORD            num;
  823. {
  824.  UBYTE          *m;
  825.  UWORD           wort;
  826.  REGISTER UWORD  i,j,k;
  827.  REGISTER ULONG  o;
  828.  
  829.  hd->MenuPageCount=0;
  830.  o=GOFFSET(num);
  831.  if(o!=0)
  832.   {
  833.    Seek(hd->HelpFile,o,OFFSET_BEGINNING);
  834.    Read(hd->HelpFile,&wort,2L);
  835.    while((wort!=0xFFFF)&&(j<=24))
  836.     {
  837.      hd->MenuPages[hd->MenuPageCount]=wort;
  838.      hd->MenuPageCount++;
  839.      Read(hd->HelpFile,&wort,2L);
  840.     }
  841.    for(j=0;j<hd->MenuPageCount;j++)
  842.     {
  843.      if(hd->MenuPages[j]!=2000)
  844.       {
  845.        GetTitle(hd,hd->MenuPages[j]);
  846.        if((strlen(hd->Memory))>60) hd->Memory[59]=0x00;
  847.        strcpy(&hd->MenuNames[j],hd->Memory);
  848.       }
  849.     }
  850.   }
  851.  MakeMenu(hd);
  852.  
  853.  RefreshGadWindow(hd);
  854.  hd->CurrentLine=0xFFFF;
  855.  hd->LineCount=0;
  856.  for(i=0;i<2000;i++) hd->Lines[i]=NULL;
  857.  
  858.  j=LENGTH(num);
  859.  Seek(hd->HelpFile,TOFFSET(num),OFFSET_BEGINNING);
  860.  Read(hd->HelpFile,hd->Memory,j);
  861.  
  862.  i=0;
  863.  while(i<j)
  864.  {
  865.   hd->Lines[hd->LineCount]=&hd->Memory[i];
  866.   i+=(strlen(&hd->Memory[i])+1);
  867.   hd->LineCount++;
  868.  } 
  869.  
  870.  ShowPart(hd,0);
  871.  
  872.  if(hd->LineCount>ZEILEN)
  873.    hd->PropBody=hd->LineCount-ZEILEN;
  874.  else
  875.    hd->PropBody=1;
  876.  NewProp(hd,hd->PropBody);
  877.  WindowToFront(hd->TextWindow);
  878. }
  879.  
  880.  
  881. VOID ShowPart(hd,part)
  882.  struct HelpData *hd;
  883.  UWORD            part;
  884. {
  885.  UBYTE          s[6];
  886.  REGISTER BYTE  test;
  887.  REGISTER UWORD i,j,k;
  888.  
  889.  if(part==hd->CurrentLine) return;
  890.  
  891.  if(!(hd->LineCount<=ZEILEN))
  892.   {
  893.    if(part>(hd->LineCount-ZEILEN)) part=hd->LineCount-ZEILEN;
  894.  
  895.    /*  part            = Zeile, ab der gelistet werden soll
  896.        hd->CurrentLine = Zeile, ab der gelistet wird          */
  897.  
  898.    if(part>hd->CurrentLine)
  899.      { test=3; if(part-hd->CurrentLine>=ZEILEN) test=1; }
  900.    else if(part<hd->CurrentLine)
  901.      { test=4; if(hd->CurrentLine-part>=ZEILEN) test=1; }
  902.    else if(part==hd->CurrentLine)
  903.      { test=1; }
  904.  
  905.    switch(test)
  906.     {
  907.      case 1:
  908.        hd->CurrentLine=part;
  909.        ConWrite(hd,"\f");
  910.        for(i=part;i<part+ZEILEN;i++)
  911.         {
  912.          ConWrite(hd,hd->Lines[i]);
  913.          ConWrite(hd,"\n");
  914.         }
  915.       break;
  916.      case 3:
  917.        j=part-hd->CurrentLine;
  918.        k=hd->CurrentLine+ZEILEN;
  919.        for(i=k;i<(k+j);i++)
  920.         {
  921.          ConWrite(hd,hd->Lines[i]);
  922.          ConWrite(hd,"\n");
  923.         }
  924.        hd->CurrentLine+=j;
  925.       break;
  926.      case 4:
  927.        j=hd->CurrentLine-part;
  928.        k=hd->CurrentLine;
  929.        ConWrite(hd,"\x9b");
  930.        ConWrite(hd,"H");
  931.        for(i=(k-j);i<k;i++)
  932.         {
  933.          ConWrite(hd,"\x9b");
  934.          ConWrite(hd,"L");
  935.          ConWrite(hd,hd->Lines[i]);
  936.          ConWrite(hd,"\n");
  937.         }
  938.        sprintf(&s,"%ldH",(ZEILEN+1));
  939.        ConWrite(hd,"\x9b");
  940.        ConWrite(hd,&s);
  941.        ConWrite(hd,"\x9b");
  942.        ConWrite(hd,"M");
  943.        hd->CurrentLine-=j;
  944.       break;
  945.     }
  946.   }
  947.  else
  948.   {
  949.    ConWrite(hd,"\f");
  950.    for(i=0;i<hd->LineCount;i++)
  951.     {
  952.      ConWrite(hd,hd->Lines[i]);
  953.      ConWrite(hd,"\n");
  954.     }
  955.   }
  956. }
  957.  
  958.  
  959. VOID RemIndexGadgets(hd)
  960.  struct HelpData *hd;
  961. {
  962.  UBYTE          i;
  963.  struct Gadget *gad;
  964.  
  965.  for(i=0;i<64;i++)
  966.   {
  967.    gad=hd->IndexGadgets[i];
  968.    if(gad!=NULL)
  969.     {
  970.      RemoveGadget(hd->IndexWindow,gad);
  971.      hd->IndexGadgets[i]=NULL;
  972.      hd->IndexGadgetPages[i]=0;
  973.     }
  974.   }
  975.  if(hd->IndexWindow->UserData!=NULL)
  976.   {
  977.    FreeRemember(&hd->IndexWindow->UserData,TRUE);
  978.    hd->IndexWindow->UserData=NULL;
  979.   }
  980.  Move(hd->IndexRastPort,0,0);
  981.  ClearScreen(hd->IndexRastPort);
  982. }
  983.  
  984.  
  985. VOID NewProp(hd,v)
  986.  struct HelpData *hd;
  987.  UWORD            v;
  988. {
  989.  
  990.  ModifyProp(hd->PropGadget,hd->MainWindow,NULL,
  991.             AUTOKNOB|PROPBORDERLESS|FREEVERT,0,0,0,65535/v);
  992. }
  993.  
  994.  
  995.  
  996. struct MenuStrip
  997. {
  998.  struct Window   *Window;
  999.  struct TextAttr  TextAttr;
  1000.  UBYTE            FrontPen;
  1001.  UBYTE            BackPen;
  1002.  
  1003.  struct Menu     *LastMenu;
  1004.  struct MenuItem *LastItem;
  1005.  struct MenuItem *LastSubItem;
  1006.  struct Remember *Remember;
  1007. };
  1008.  
  1009. /* MenuStrip Grundstruktur erstellen */
  1010. struct MenuStrip *BuildMenuStrip(win,fp,bp)
  1011.  struct Window   *win;
  1012.  UWORD            fp,bp;
  1013. {
  1014.  register struct MenuStrip *ms;
  1015.  register struct RastPort  *rp;
  1016.  
  1017.  ms=AllocMem(sizeof(struct MenuStrip),MEMF_CLEAR|MEMF_PUBLIC);
  1018.  if(ms!=NULL)
  1019.   {
  1020.    ms->Window=win;
  1021.    rp=win->RPort;
  1022.    ms->TextAttr.ta_Name=rp->Font->tf_Message.mn_Node.ln_Name;
  1023.    ms->TextAttr.ta_YSize=rp->Font->tf_YSize;
  1024.    ms->TextAttr.ta_Flags=rp->Font->tf_Flags;
  1025.    ms->TextAttr.ta_Style=rp->AlgoStyle;
  1026.    ms->FrontPen=fp;
  1027.    ms->BackPen=bp;
  1028.   }
  1029.  return(ms);
  1030. }
  1031.  
  1032. struct Menu *AddMenu(ms,x,w,name)
  1033.  struct MenuStrip *ms;
  1034.  UWORD             x,w;
  1035.  UBYTE            *name;
  1036. {
  1037.  register struct Menu *me;
  1038.  
  1039.  me=AllocRemember(&ms->Remember,sizeof(struct Menu),MEMF_CLEAR|MEMF_PUBLIC);
  1040.  if(me!=NULL)
  1041.   {
  1042.    me->LeftEdge=x;
  1043.    me->TopEdge=0;
  1044.    me->Width=w;
  1045.    me->Height=10;
  1046.    me->Flags=MENUENABLED;
  1047.    me->MenuName=name;
  1048.    me->NextMenu=ms->LastMenu;
  1049.    ms->LastMenu=me;
  1050.    ms->LastItem=NULL;
  1051.    ms->LastSubItem=NULL;
  1052.   }
  1053.  return(me);
  1054. }
  1055.  
  1056. struct MenuItem *AddItem(ms,name,w,cmd,enabled,highcomp)
  1057.  struct MenuStrip *ms;
  1058.  UBYTE            *name;
  1059.  UWORD             w;
  1060.  UBYTE             cmd;
  1061.  BOOL              enabled,highcomp;
  1062. {
  1063.  register struct Menu      *me;
  1064.  register struct MenuItem  *mi;
  1065.  register struct IntuiText *it;
  1066.  
  1067.  me=ms->LastMenu;
  1068.  if(me!=NULL)
  1069.   {
  1070.    mi=AllocRemember(&ms->Remember,sizeof(struct MenuItem)+sizeof(struct IntuiText),MEMF_CLEAR|MEMF_PUBLIC);
  1071.    if(mi!=NULL)
  1072.     {
  1073.      it=(ULONG)mi+(ULONG)sizeof(struct MenuItem);
  1074.  
  1075.      if(ms->LastItem!=NULL)
  1076.        mi->TopEdge=ms->LastItem->TopEdge+10;
  1077.      else
  1078.        mi->TopEdge=0;
  1079.      mi->LeftEdge=0;
  1080.      mi->Width=w;
  1081.      mi->Height=10;
  1082.      mi->Flags=ITEMTEXT;
  1083.      if(enabled) mi->Flags |= ITEMENABLED;
  1084.      if(highcomp) mi->Flags |= HIGHCOMP; else mi->Flags |= HIGHNONE;
  1085.      if(cmd!=0)
  1086.       {
  1087.        mi->Flags |= COMMSEQ;
  1088.        mi->Command=cmd;
  1089.       }
  1090.      mi->ItemFill=it;
  1091.      it->LeftEdge=AUTOLEFTEDGE;
  1092.      it->TopEdge=1;
  1093.      it->DrawMode=JAM1;
  1094.      it->FrontPen=ms->FrontPen;
  1095.      it->BackPen=ms->BackPen;
  1096.      it->ITextFont=&ms->TextAttr;
  1097.      it->IText=name;
  1098.      mi->NextItem=ms->LastItem;
  1099.      ms->LastItem=mi;
  1100.      ms->LastSubItem=NULL;
  1101.      me->FirstItem=mi;
  1102.     }
  1103.   }
  1104.  return(mi);
  1105. }
  1106.  
  1107. VOID UseMenuStrip(ms)
  1108.  struct MenuStrip *ms;
  1109. {
  1110.  
  1111.  if(ms->LastMenu!=NULL) SetMenuStrip(ms->Window,ms->LastMenu);
  1112. }
  1113.  
  1114. VOID RemoveMenuStrip(ms,bool)
  1115.  struct MenuStrip *ms;
  1116.  BOOL              bool;
  1117. {
  1118.  ClearMenuStrip(ms->Window);
  1119.  if(ms->Remember!=NULL) FreeRemember(&ms->Remember,TRUE);
  1120.  ms->Remember=NULL;
  1121.  ms->LastMenu=NULL;
  1122.  ms->LastItem=NULL;
  1123.  ms->LastSubItem=NULL;
  1124.  if(bool==TRUE) FreeMem(ms,sizeof(struct MenuStrip));
  1125. }
  1126.  
  1127. UBYTE *GetOpalLine()
  1128. {
  1129.  return((UBYTE *)"·········································································");
  1130. }
  1131.  
  1132. UBYTE *GetOpalLine450()
  1133. {
  1134.  return((UBYTE *)"·················································································································");
  1135. }
  1136.  
  1137. VOID MacFormat(hd,tex,x)
  1138.  struct HelpData *hd;
  1139.  UBYTE           *tex;
  1140.  UWORD            x;
  1141. {
  1142.  REGISTER UWORD i,j,k,l;
  1143.  
  1144.  k=strlen(tex);
  1145.  l=TextLength(hd->MainRastPort,tex,k);
  1146.  if(l>x)
  1147.   {
  1148.    i=0;
  1149.    j=TextLength(hd->MainRastPort,"...",3);
  1150.    l=j;
  1151.    do
  1152.     {
  1153.      j+=TextLength(hd->MainRastPort,&tex[i],1L);
  1154.      i++;
  1155.     } while(j<x);
  1156.    tex[i]=0x00;
  1157.    strcat(tex,"...");
  1158.   }
  1159. }
  1160.  
  1161.  
  1162. VOID MakeMenu(hd)
  1163.  struct HelpData *hd;
  1164. {
  1165.  REGISTER UWORD i,j;
  1166.  
  1167.  RemoveMenuStrip(hd->MenuStrip,FALSE);
  1168.  hd->DateiMenu=AddMenu(hd->MenuStrip,5,150,"Datei");
  1169.  AddItem(hd->MenuStrip,"Einstellunden ändern",300,'E',TRUE,TRUE);
  1170.  AddItem(hd->MenuStrip,"Bedienungshinweise",300,'B',TRUE,TRUE);
  1171.  AddItem(hd->MenuStrip,"Information",300,'I',TRUE,TRUE);
  1172.  AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1173.  AddItem(hd->MenuStrip,"Hilfe beenden",300,'Q',TRUE,TRUE);
  1174.  hd->QVMenu=AddMenu(hd->MenuStrip,160,150,"Querverweise");
  1175.  if((hd->Flags==PAGE_TEXT)&&(hd->MenuPageCount>0))
  1176.   {
  1177.    for(i=0;i<hd->MenuPageCount;i++)
  1178.     {
  1179.      if(hd->MenuPages[i]!=2000)
  1180.       {
  1181.        MacFormat(hd,&hd->MenuNames[i],430);
  1182.        AddItem(hd->MenuStrip,&hd->MenuNames[i],450,0,TRUE,TRUE);
  1183.       }
  1184.      else AddItem(hd->MenuStrip,GetOpalLine450(),450,0,FALSE,FALSE);
  1185.     }
  1186.   }
  1187.  else AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1188.  hd->BilderMenu=AddMenu(hd->MenuStrip,315,150,"Bilder");
  1189.  AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1190.  UseMenuStrip(hd->MenuStrip);
  1191.  ActivateWindow(hd->MainWindow);
  1192. }
  1193.  
  1194.  
  1195. VOID Hinweise(hd)
  1196.  struct HelpData *hd;
  1197. {
  1198.  REGISTER UWORD i;
  1199.  
  1200.  WindowToFront(hd->TextWindow);
  1201.  RemIndexGadgets(hd);
  1202.  hd->Flags=PAGE_TEXT;
  1203.  hd->Page=1001;
  1204.  hd->CurrentLine=0xFFFF;
  1205.  hd->LineCount=Strings;
  1206.  for(i=0;i<Strings;i++) hd->Lines[i]=String[i];
  1207.  for( ;i<2000;i++) hd->Lines[i]=NULL;
  1208.  ShowPart(hd,0);
  1209.  hd->PropBody=hd->LineCount-ZEILEN;
  1210.  NewProp(hd,hd->PropBody);
  1211.  WindowToFront(hd->TextWindow);
  1212. }
  1213.  
  1214.